home *** CD-ROM | disk | FTP | other *** search
Text File | 1996-02-20 | 13.0 KB | 379 lines | [TEXT/CWIE] |
- /*
- File: MarkToken.c
-
- Contains: xxx put contents here xxx
-
- Written by: Andy Nicholas, Greg Anderson, Tom Conrad, Chris Bingham, Georgiann Puckett, John Thompson-Rohrlich
-
- Copyright: © 1994-1995 by Apple Computer, Inc., all rights reserved.
-
- <9> 6/6/95 ga
-
- */
-
- #ifdef MWTRACEBACKTABLES
- #pragma traceback on
- #endif
-
- #include "MarkToken.h"
- #include "ScriptableObjectList.h"
-
- #include <AERegistry.h>
- #include "Exceptions.h"
-
- //----------------------------------------------------------------------------------------
- // MarkTokenMergeProc:
- //
- // This is the callback function used to merge tokens in TTokenDescriptor::AdoptToken
- //----------------------------------------------------------------------------------------
- TAbstractScriptableObject* MarkTokenMergeProc(TAbstractScriptableObject* baseToken, TAbstractScriptableObject* mergeToken)
- {
- return baseToken->AdoptToken(mergeToken, kAlwaysMakeCollection);
- } // MarkTokenMergeProc
-
- //========================================================================================
- // CLASS TMarkToken
- //========================================================================================
-
-
- #pragma segment ObjectResident
- ImplementSmallClassData(TMarkToken, clMarkToken);
-
- #pragma segment MarkToken
-
- //----------------------------------------------------------------------------------------
- // TMarkToken::~TMarkToken:
- //----------------------------------------------------------------------------------------
- TMarkToken::~TMarkToken()
- {
- if(fMarkList != nil)
- {
- {
- for(AnIteratorOfAListOf<TAbstractScriptableObject*> iter(this->fMarkList); iter.More(); iter.Next())
- iter.Current()->DisposeDesignator();
- }
-
- delete fMarkList;
- }
- } // TMarkToken::~TMarkToken
-
- //----------------------------------------------------------------------------------------
- // TMarkToken::IMarkToken:
- //----------------------------------------------------------------------------------------
- void TMarkToken::IMarkToken()
- {
- if(fMarkList == nil)
- fMarkList = new AListOf<TAbstractScriptableObject*>;
-
- TProxyToken::IProxyToken(nil);
- } // TMarkToken:: IMarkToken
-
- //----------------------------------------------------------------------------------------
- // TMarkToken::CloneOwnedObjects
- //----------------------------------------------------------------------------------------
- void TMarkToken::CloneOwnedObjects()
- {
- if(fMarkList)
- {
- AListOf<TAbstractScriptableObject*>* markListToClone = fMarkList;
- fMarkList = new AListOf<TAbstractScriptableObject*>(markListToClone->ItemsInList());
-
- for(AnIteratorOfAListOf<TAbstractScriptableObject*> iter(markListToClone); iter.More(); iter.Next())
- {
- TAbstractScriptableObject* clonedItem = iter.Current()->CloneDesignator();
- fMarkList->Add(clonedItem);
- }
- }
- } // TMarkToken::CloneOwnedObjects
-
- //----------------------------------------------------------------------------------------
- // TMarkToken::DerivedFromOSLClass:
- //----------------------------------------------------------------------------------------
- Boolean TMarkToken::DerivedFromOSLClass(const TAETransaction& t, DescType objectClass)
- {
- return (objectClass == cMarkToken) || (Inherited::DerivedFromOSLClass(t, objectClass));
- } // TMarkToken::DerivedFromOSLClass
-
- //----------------------------------------------------------------------------------------
- // TMarkToken::BestType
- //----------------------------------------------------------------------------------------
- DescType TMarkToken::BestType(const TAETransaction& t, DescType propertyName)
- {
- DescType bestType = 0;
-
- if((propertyName == pContents) && (fIsUnionMark == kPropertyUnion))
- bestType = typeBest;
- else
- bestType = Inherited::BestType(t, propertyName);
-
- return bestType;
- } // TMarkToken::BestType
-
- //----------------------------------------------------------------------------------------
- // TMarkToken::DefaultType
- //----------------------------------------------------------------------------------------
- DescType TMarkToken::DefaultType(const TAETransaction& t, DescType propertyName)
- {
- DescType defaultType = 0;
-
- if((propertyName == pContents) && (fIsUnionMark == kPropertyUnion))
- defaultType = typeWildCard;
- else
- defaultType = Inherited::DefaultType(t, propertyName);
-
- return defaultType;
- } // TMarkToken::DefaultType
-
- //----------------------------------------------------------------------------------------
- // TMarkToken::DirectObjectIterator
- //----------------------------------------------------------------------------------------
- TAbstractObjectIterator* TMarkToken::DirectObjectIterator(const TAETransaction&)
- {
- //
- // Iterate direct objects, not elements, and do not require 'Exists' to
- // be true in order to touch an object in an iteration.
- //
- return new TMarkTokenIterator(fMarkList, false, false);
- } // TMarkToken::DirectObjectIterator
-
- //----------------------------------------------------------------------------------------
- // TMarkToken::ElementIterator
- //----------------------------------------------------------------------------------------
- TAbstractObjectIterator* TMarkToken::ElementIterator(const TAETransaction&)
- {
- //
- // If this is a 'union' mark, then iterate the elements of the
- // items in the mark list. Otherwise, iterate the direct objects
- // of the items in the mark list.
- //
- return new TMarkTokenIterator(fMarkList, IsUnionMark(), true);
- } // TMarkToken::ElementIterator
-
- //----------------------------------------------------------------------------------------
- // TMarkToken::AdoptToken:
- //
- // See TAbstractScriptableObject::AddThisToMarkToken for an explanation of how this
- // routine is commonly used.
- //----------------------------------------------------------------------------------------
- TAbstractScriptableObject* TMarkToken::AdoptToken(TAbstractScriptableObject* token, TypeOfMarkToken /*isUnionMark*/)
- {
- //
- // ◊Script: Should we test to see if this->IsUnionMark() == isUnionMark?
- // What would we do if that wasn't the case? Call this->SetUnionMark(isUnionMark);?
- //
- if(token != nil)
- fMarkList->Add(token);
-
- return this;
- } // TMarkToken::AdoptToken
-
- //----------------------------------------------------------------------------------------
- // TMarkToken::AddThisToMarkToken:
- //
- // See TAbstractScriptableObject::AddThisToMarkToken for a complete description of how
- // this code works. This routine works the same way, but it removes the contents of
- // this mark token and adds it, one item at a time, to the mark token provided. This
- // prevents having mark tokens inside of mark tokens.
- //----------------------------------------------------------------------------------------
- void TMarkToken::AddThisToMarkToken(TAbstractScriptableObject*& markToken, TypeOfMarkToken isUnionMark)
- {
- if(markToken == nil)
- {
- markToken = this;
- }
- else
- {
- for(AnIteratorOfAListOf<TAbstractScriptableObject*> iter(this->fMarkList); iter.More(); iter.Next())
- {
- markToken = markToken->AdoptToken(iter.Current(), isUnionMark);
- }
-
- //
- // Self deletion is generally evil, but the semantics of this
- // call is to pass ownership of this token to the provided
- // mark token, so no code should ever reference this object after
- // calling AddThisToMarkToken.
- //
- delete this;
- }
- } // TMarkToken::AddThisToMarkToken
-
- //----------------------------------------------------------------------------------------
- // TMarkToken::AdjustMarks:
- //----------------------------------------------------------------------------------------
- void TMarkToken::AdjustMarks(long newStart, long newStop)
- {
- unsigned long i = 1;
- unsigned long total = this->fMarkList->ItemsInList();
- Boolean reverseOrderOfList = false;
-
- //
- // First, adjust for negative indices
- //
- if(newStart < 0)
- newStart = total + 1 + newStart;
- if(newStop < 0)
- newStop = total + 1 + newStop;
-
- //
- // Next, swap newStart and newStop if their order is reversed
- //
- if(newStart > newStop)
- {
- long temp = newStop;
- newStop = newStart;
- newStart = temp;
- reverseOrderOfList = true;
- }
-
- //
- // Once we have the correct range, prune out the items
- // that aren't wanted.
- //
- for(AnIteratorOfAListOf<TAbstractScriptableObject*> iter(this->fMarkList); iter.More(); iter.Next())
- {
- if((i < newStart) || (i > newStop))
- {
- iter.Current()->DisposeDesignator();
- iter.RemoveCurrent();
- }
- ++i;
- }
-
- //
- // Finally, reverse the order of the list if
- // the start was greater than the stop
- //
- if(reverseOrderOfList)
- {
- this->fMarkList->ReverseOrderOfList();
- }
- } // TMarkToken::AdjustMarks
- //========================================================================================
- // Class TMarkTokenIterator
- //========================================================================================
-
- //----------------------------------------------------------------------------------------
- // TMarkTokenIterator::~TMarkTokenIterator
- //----------------------------------------------------------------------------------------
- TMarkTokenIterator::~TMarkTokenIterator()
- {
- delete fListIter;
- delete fCurrentIter;
- if(fDeleteListOnDestruction)
- delete fMarkList;
- }
-
- //----------------------------------------------------------------------------------------
- // TMarkTokenIterator::SetupCurrentIterator
- //----------------------------------------------------------------------------------------
- void TMarkTokenIterator::SetupCurrentIterator(const TAETransaction& t)
- {
- delete fCurrentIter;
- fCurrentIter = nil;
-
- while((fCurrentIter == nil) && (fListIter->More(t)))
- {
- TAbstractScriptableObject* listIterCurrent = fListIter->Current(t);
- REQUIREVALIDPOINTER(listIterCurrent); // If nil, fListIter->More should have been false
-
- //
- // If 'fRequireExists' is true, then skip any item whose
- // 'Exists' method returns false.
- //
- // Q: Why ever check to see if the item exists? If the item doesn't
- // exist, won't its iterator's More() method always return false?
- //
- // A: This is a very important concept. It is true that whenever
- // an empty iterator is returned, Exists will always return false.
- // However, in some cases, Exists will return false even if the
- // iterator has elements. One example of this is a token to a window
- // that is not open; Exists returns false, because the window does not
- // exist (and should not be counted); however, the direct object iterator
- // will return it so that the token will continue to get messages
- // (e.g. "open").
- //
- if((fRequireExists == false) || (listIterCurrent->Exists(t) == true))
- {
- TAbstractObjectIterator* testIterator = nil;
-
- //
- // If we're not iterating elements, then we're iterating direct objects
- //
- if(fIterateElements)
- testIterator = listIterCurrent->ElementIterator(t);
- else
- testIterator = listIterCurrent->DirectObjectIterator(t);
-
- // listIterCurrent->DisposeDesignator();
-
- //
- // Skip any iterator with no elements (should be rare...)
- //
- if((testIterator == nil) || (testIterator->More(t) == false))
- {
- if(testIterator != nil)
- testIterator->Release();
- fListIter->Next(t);
- }
- else
- fCurrentIter = testIterator;
- }
- }
- }
-
- //----------------------------------------------------------------------------------------
- // TMarkTokenIterator::Reset
- //----------------------------------------------------------------------------------------
- void TMarkTokenIterator::Reset(const TAETransaction& t, Boolean iterationDirection /*= kForwardIteration*/)
- {
- if(fListIter == nil)
- fListIter = new TScriptableObjectListIterator(fMarkList);
-
- fDirection = iterationDirection;
- fListIter->Reset(t, iterationDirection);
-
- this->SetupCurrentIterator(t);
- }
-
- //----------------------------------------------------------------------------------------
- // TMarkTokenIterator::More
- //----------------------------------------------------------------------------------------
- Boolean TMarkTokenIterator::More(const TAETransaction& t) const
- {
- return fCurrentIter ? fCurrentIter->More(t) : false;
- }
-
- //----------------------------------------------------------------------------------------
- // TMarkTokenIterator::Next
- //----------------------------------------------------------------------------------------
- void TMarkTokenIterator::Next(const TAETransaction& t)
- {
- if(fCurrentIter)
- {
- fCurrentIter->Next(t);
- if(fCurrentIter->More(t) == false)
- {
- fListIter->Next(t);
- this->SetupCurrentIterator(t);
- }
- }
- }
-
- //----------------------------------------------------------------------------------------
- // TMarkTokenIterator::Current
- //----------------------------------------------------------------------------------------
- TAbstractScriptableObject* TMarkTokenIterator::Current(const TAETransaction& t)
- {
- return fCurrentIter ? fCurrentIter->Current(t) : nil;
- }
-
- //----------------------------------------------------------------------------------------
- // TMarkTokenIterator::SearchDeep
- //----------------------------------------------------------------------------------------
- void TMarkTokenIterator::SearchDeep(const TAETransaction& t, TAbstractCollector* collector, DescType desiredClass, TAbstractSearchSpec* searchSpec)
- {
- this->RecursiveSearchDeep(t, collector, desiredClass, searchSpec);
- } // TMarkTokenIterator::SearchDeep
-
-